package entidades.util;

import entidades.Ponto;
import entidades.Rectangulo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;

/**
 * Trabalho DAS - 2014/2015
 *
 * @author a21210380, a21190325, a21210392
 */
public class Grelha {

    public final static int NUMERO_LINHAS = 4000;
    public final static int ESPACO_ENTRE_LINHAS = 40;
    public final static int ALTURA_RECT = 15;
    
    private final BooleanProperty visivel = new SimpleBooleanProperty(true);

    private final List<LinhaDaGrelha> horizontal = new ArrayList<>();
    private final List<LinhaDaGrelha> vertical = new ArrayList<>();

    public Grelha() {
        for (int i = ESPACO_ENTRE_LINHAS; i < NUMERO_LINHAS; i += ESPACO_ENTRE_LINHAS) {
            buildHorizontal(i);
            buildVertical(i);
        }
    }
    
    public int getLargura() {
        return NUMERO_LINHAS;
    }
    
    public int getAltura() {
        return NUMERO_LINHAS;
    }
    
    public void setVisible(boolean visivel) {
        this.visivel.setValue(visivel);
        horizontal.forEach((linha) -> linha.selecionar(false));
        vertical.forEach((linha) -> linha.selecionar(false));
    }

    private void buildHorizontal(int i) {
        Ponto inicio = new Ponto(0, i);
        Ponto fim = new Ponto(NUMERO_LINHAS, i);
        
        Ponto origemCima = new Ponto(0, i-ALTURA_RECT);
        Rectangulo cima = new Rectangulo(origemCima, ALTURA_RECT, NUMERO_LINHAS, 0);
        
        Rectangulo baixo = new Rectangulo(inicio, ALTURA_RECT, NUMERO_LINHAS, 0);
        
        horizontal.add(new LinhaDaGrelha(LinhaDaGrelha.Orientacao.Horizontal, inicio, fim, cima, baixo));
    }
    
    private void buildVertical(int i) {
        Ponto inicio = new Ponto(i, 0);
        Ponto fim = new Ponto(i, NUMERO_LINHAS);
        
        Rectangulo frente = new Rectangulo(inicio, NUMERO_LINHAS, ALTURA_RECT, 0);
        
        Ponto origemTras = new Ponto(i-ALTURA_RECT, 0);
        Rectangulo tras = new Rectangulo(origemTras, NUMERO_LINHAS, ALTURA_RECT, 0);
        
        vertical.add(new LinhaDaGrelha(LinhaDaGrelha.Orientacao.Vertical, inicio, fim, frente, tras));
    }

    public BooleanProperty visivelProperty() {
        return visivel;
    }

    public List<LinhaDaGrelha> getHorizontal() {
        return horizontal;
    }

    public List<LinhaDaGrelha> getVertical() {
        return vertical;
    }

    public LinhaDaGrelha contem(float x, float y) {
        for(LinhaDaGrelha l : horizontal) {
            Rectangulo contem = l.contem(x, y);
            if(contem != null) {
                return l;
            }
        }
        for (LinhaDaGrelha l : vertical) {
            Rectangulo contem = l.contem(x, y);
            if(contem != null) {
                return l;
            }
        }
        return null;
    }
}
